package com.ltcode.auth.domain.repository;

import com.ltcode.auth.domain.model.Captcha;

import java.util.Optional;

/**
 * 验证码仓储接口
 * 
 * @author ltcode
 * @since 2024-01-01
 */
public interface CaptchaRepository {

    /**
     * 保存验证码
     * 
     * @param captcha 验证码信息
     * @return 保存后的验证码信息
     */
    Captcha save(Captcha captcha);

    /**
     * 根据UUID查询验证码
     * 
     * @param uuid 验证码唯一标识
     * @return 验证码信息
     */
    Optional<Captcha> findByUuid(String uuid);

    /**
     * 删除验证码
     * 
     * @param uuid 验证码唯一标识
     */
    void deleteByUuid(String uuid);

    /**
     * 更新验证码使用状态
     * 
     * @param uuid 验证码唯一标识
     * @param used 是否已使用
     */
    void updateUsedStatus(String uuid, boolean used);

    /**
     * 增加验证码失败次数
     * 
     * @param uuid 验证码唯一标识
     */
    void incrementFailCount(String uuid);

    /**
     * 检查验证码是否存在
     * 
     * @param uuid 验证码唯一标识
     * @return 是否存在
     */
    boolean existsByUuid(String uuid);

    /**
     * 清理过期验证码
     */
    void cleanExpiredCaptchas();

    /**
     * 根据类型统计验证码数量
     * 
     * @param type 验证码类型
     * @return 数量
     */
    long countByType(Captcha.CaptchaType type);

    /**
     * 设置验证码过期时间（分钟）
     * 
     * @param uuid 验证码唯一标识
     * @param expireMinutes 过期分钟数
     */
    void setExpireTime(String uuid, int expireMinutes);
}
